.TITLE CRDRV .IDENT /09.00/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; D. N. CUTLER 3-MAR-74 ; ; MODIFIED FOR M-PLUS V2.0 BY: ; ; A. GROUPE ; P. J. CARR ; ; MODIFIED BY: ; ; P. J. CARR 10-FEB-82 08.01 ; ; PJC044 -- CORRECT DETACH FUNCTION ; ; P. J. CARR 8-APR-82 08.02 ; ; PJC050 -- CHECK FOR CARD DONE CONDITION IN CRINT ; ; P. J. CARR 2-JUN-82 08.03 ; ; PJC057 -- CORRECT PROCESSING OF PICK CHECK ERRORS ; ; P. J. CARR 16-AUG-82 08.04 ; ; PJC062 -- CORRECT FOR LAST CARD BEFORE HOPPER ERROR ; BEING READ AS BLANK ; ; D. MAILLOUX 28-MAR-82 08.05 ; ; DMM053 -- CORRECT USE OF ALLOCATED AST BLOCK ; ; ; CR11 CARD READER CONTROLLER DRIVER ; ; MACRO LIBRARY CALLS ; .MCALL ABODF$,HWDDF$,PKTDF$,UCBDF$ ABODF$ ;DEFINE TASK ABORT CODES HWDDF$ ;DEFINE HARDWARE REGISTERS PKTDF$ ;DEFINE I/O PACKET OFFSETS UCBDF$ ;DEFINE UCB OFFSETS ; ; EQUATED SYMBOLS ; ASTSIZ= 16. ;SIZE OF AST BLOCK STKSIZ= 14. ;SIZE OF STACK IN AST BLOCK ; ; CR11 DEVICE REGISTER OFFSETS ; CRCS= 0 ;CARD READER CONTROL STATUS REGISTER CRDB= 2 ;CARD READER DATA BUFFER ; ; CARD READER CONTROL STATUS REGISTER ; ERR= 100000 ;COMBINED ERROR CRDONE= 40000 ;CARD DONE HOPERR= 20000 ;HOPPER CHECK ERROR MTNERR= 10000 ;MOTION ERROR TIMERR= 4000 ;TIMING ERROR TRONL= 2000 ;TRANSITION TO ONLINE BUSY= 1000 ;BUSY READY= 400 ;ONLINE, READY TO READ (=0) DONE= 200 ;COLUMN OF DATA IS READY IN CRDB IE= 100 ;INTERRUPT ENABLE READ= 1 ;READ TIMERR= 4000 ;TIMING ERROR (U.CW2) ; CARD READER CONTROL BLOCK OFFSETS ; STRBF=U.CNT+2 ;STARTING ADDRESS OF DATA BUFFER CURBF=U.CNT+4 ;CURRENT ADDRESS IN DATA BUFFER EOFCL=U.CNT+6 ;NUMBER OF COLUMNS FOR VALID EOF EOFCT=U.CNT+7 ;NUMBER OF EOF PUNCHES ENCOUNTERED CCOLC=U.CNT+10 ;CURRENT COLUMN COUNTER CCOL1=U.CNT+12 ;CONTENTS OF CARD COLUMN ONE ; ; SPECIAL CARD PUNCH PATTERNS ; CREOF=7417 ;END OF FILE (12-11-0-1-6-7-8-9) CR026=4242 ;TRANSLATE 026 CODE (12-2-4-8) CR029=5252 ;TRANSLATE 029 CODE (12-0-2-4-6-8) ; ; LOCAL DATA ; ; 029 TRANSLATION TABLE ; TB029: .BYTE 40 ;SPACE .BYTE 61 ;1 .BYTE 62 ;2 .BYTE 63 ;3 .BYTE 64 ;4 .BYTE 65 ;5 .BYTE 66 ;6 .BYTE 67 ;7 .BYTE 70 ;8 .BYTE 40 ;EMPTY .BYTE 72 ;: .BYTE 43 ;# .BYTE 100 ;@ .BYTE 47 ;' .BYTE 75 ;= .BYTE 42 ;" .BYTE 71 ;9 .BYTE 60 ;0 .BYTE 57 ;/ .BYTE 123 ;S .BYTE 124 ;T .BYTE 125 ;U .BYTE 126 ;V .BYTE 127 ;W .BYTE 130 ;X .BYTE 131 ;Y .BYTE 40 ;EMPTY .BYTE 134 ;\ .BYTE 54 ;, .BYTE 45 ;% .BYTE 137 ; .BYTE 76 ;> .BYTE 77 ;? .BYTE 132 ;Z .BYTE 55 ;- .BYTE 112 ;J .BYTE 113 ;K .BYTE 114 ;L .BYTE 115 ;M .BYTE 116 ;N .BYTE 117 ;O .BYTE 120 ;P .BYTE 121 ;Q .BYTE 40 ;EMPTY .BYTE 135 ;] .BYTE 44 ;$ .BYTE 52 ;* .BYTE 51 ;) .BYTE 73 ;; .BYTE 136 ;^ .BYTE 122 ;R .BYTE 46 ;& .BYTE 101 ;A .BYTE 102 ;B .BYTE 103 ;C .BYTE 104 ;D .BYTE 105 ;E .BYTE 106 ;F .BYTE 107 ;G .BYTE 110 ;H .BYTE 40 ;EMPTY .BYTE 133 ;[ .BYTE 56 ;. .BYTE 74 ;< .BYTE 50 ;( .BYTE 53 ;+ .BYTE 41 ;! .BYTE 111 ;I .BYTE 173 ;LEFT CURLY BRACKET .BYTE 175 ;RIGHT CURLY BRACKET ; ; 026 TRANSLATION TABLE ; TB026: .BYTE 40 ;SPACE .BYTE 61 ;1 .BYTE 62 ;2 .BYTE 63 ;3 .BYTE 64 ;4 .BYTE 65 ;5 .BYTE 66 ;6 .BYTE 67 ;7 .BYTE 70 ;8 .BYTE 40 ;EMPTY .BYTE 137 ; .BYTE 75 ;= .BYTE 100 ;@ .BYTE 136 ;^ .BYTE 47 ;' .BYTE 134 ;\ .BYTE 71 ;9 .BYTE 60 ;0 .BYTE 57 ;/ .BYTE 123 ;S .BYTE 124 ;T .BYTE 125 ;U .BYTE 126 ;V .BYTE 127 ;W .BYTE 130 ;X .BYTE 131 ;Y .BYTE 40 ;EMPTY .BYTE 73 ;; .BYTE 54 ;, .BYTE 50 ;( .BYTE 42 ;" .BYTE 43 ;# .BYTE 45 ;% .BYTE 132 ;Z .BYTE 55 ;- .BYTE 112 ;J .BYTE 113 ;K .BYTE 114 ;L .BYTE 115 ;M .BYTE 116 ;N .BYTE 117 ;O .BYTE 120 ;P .BYTE 121 ;Q .BYTE 40 ;EMPTY .BYTE 72 ;: .BYTE 44 ;$ .BYTE 52 ;* .BYTE 133 ;[ .BYTE 76 ;> .BYTE 46 ;& .BYTE 122 ;R .BYTE 53 ;+ .BYTE 101 ;A .BYTE 102 ;B .BYTE 103 ;C .BYTE 104 ;D .BYTE 105 ;E .BYTE 106 ;F .BYTE 107 ;G .BYTE 110 ;H .BYTE 40 ;EMPTY .BYTE 77 ;? .BYTE 56 ;. .BYTE 51 ;) .BYTE 135 ;] .BYTE 74 ;< .BYTE 41 ;! .BYTE 111 ;I .BYTE 173 ;LEFT CURLY BRACKET .BYTE 175 ;RIGHT CURLY BRACKET .EVEN ; ; DRIVER DISPATCH TABLE ; DDT$ CR,C$$R11,,,UCBSV ;+ ; **-CRINI-CR11 CARD READER CONTROLLER INITIATOR ; ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEST ; IS QUEUED AND AT THE END OF PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU- ; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPT ; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IS ; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER- ; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED. ; ; INPUTS: ; ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; OUTPUTS: ; ; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT- ; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER- ; ATION IS INITIATED. ;- .ENABL LSB CRINI: GTPKT$ CR,C$$R11,CRPWF,UCBSV,T ; ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ; R1=ADDRESS OF THE I/O REQUEST PACKET. ; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3=CONTROLLER INDEX. ; R4=ADDRESS OF THE STATUS CONTROL BLOCK. ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; CARD READER I/O REQUEST PACKET FORMAT: ; ; WD. 00 -- I/O QUEUE THREAD WORD. ; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER. ; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK. ; WD. 03 -- POINTER TO THE SECOND WORD IN REQUESTER TASK HEADER. ; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB). ; WD. 05 -- I/O FUNCTION CODE (IO.RLB). ; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK. ; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK. ; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +140000). ; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ; WD. 12 -- RELOCATION BIAS OF I/O BUFFER. ; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER. ; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; WD. 15 -- NOT USED. ; WD. 16 -- NOT USED. ; WD. 17 -- NOT USED. ; WD. 20 -- NOT USED. ; CLR STRBF(R5) ;ASSUME ALLOCATION FAILURE CALL CRATT ;IS IT AN ATTACH OR DETACH FUNCTION? BCS 160$ ;IF CS YES MOV #80.,R0 ;ASSUME ASCII OR PACKED HOLLERITH MOVB I.FCN(R1),U.CW2(R5) ;SAVE SUBFUNCTION MODIFIER BITS BPL 10$ ;IF PL ASCII OR PACKED HOLLERITH ASL R0 ;BINARY READ REQUIRES 160. BYTES 10$: MOV R0,R1 ;SET LENGTH OF BUFFER REQUIRED CALL $ALOCB ;ALLOCATE DATA BUFFER BCS 90$ ;IF CS, NO BUFFER AVAILABLE MOV R0,STRBF(R5) ;SAVE STARTING BUFFER ADDRESS BICB #US.ABO,U.STS(R5) ;CLEAR ABORT REQUEST FLAG ; ; INITIATE CARD READ ; 20$: MOV R5,R3 ;CALCULATE ADDRESS OF CARD READER ADD #STRBF,R3 ;CONTROL BLOCK MOV (R3)+,(R3)+ ;SET CURRENT ADDRESS IN DATA BUFFER MOVB #1,(R3) ;ASSUME ASCII OR PACKET HOLLERITH TSTB U.CW2(R5) ;BINARY READ? BPL 30$ ;IF PL NO MOVB #8.,(R3) ;SET EOF COUNT FOR BINARY READ 30$: MOVB (R3)+,(R3)+ ;SET EOF COLUMN COUNTER CLR (R3) ;CLEAR CARD COLUMN COUNTER MOV S.CSR(R4),R2 ;GET CARD READER CSR ADDRESS BIT #READY,(R2)+ ;READY? BNE CROUT ;IF NE NO MOVB S.ITM(R4),S.CTM(R4) ;SET DEVICE TIMEOUT COUNT MOV (R2),R0 ;READ DATA BUFFER CLEAR DONE IF SET MOV #,-(R2) ;START CARD MOTION ; ; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSES ; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITION ; THAT COULD EXIST IN RESTARTING THE I/O OPERATION. ; CRPWF: ; ; ; CALL US BACK AFTER DEQUEUING AST ; CRCUB:: RETURN ; ; ; CARD READ ERROR DURING A READ OPERATION ; CRERR: MOV #T.NCRE,R0 ;SET FOR HARDWARE ERROR MESSAGE BR 50$ ; ; ; DEVICE TIMEOUT RESULTS IN A NOT READY MESSAGE BEING PUT OUT AT ; A SYSGEN SPECIFIED INTERVAL. TIMEOUTS ARE CAUSED BY POWERFAILURE ; AND CARD READER FAULT CONDITIONS. ; CROUT: ;;; CLR @S.CSR(R4) ;;;DISABLE CARD READER INTERRUPT MTPS #0 ;;;ALLOW INTERRUPTS .IF DF,T$$KMG 40$: MOV #T.NDNR,R0 ;SET FOR NOT READY MESSAGE .IFTF 50$: BITB #US.ABO,U.STS(R5) ;ABORT REQUESTED? BNE 120$ ;IF NE YES .IFT BIT #TIMERR,U.CW2(R5) ;TIMING ERROR? BEQ 60$ ;IF EQ NO BIT #READY,@S.CSR(R4) ;OPERATOR PUT READER OFFLINE? BEQ 70$ ;IF EQ NO BIC #TIMERR,U.CW2(R5) ;CLEAR TIMING ERROR BIT .IFTF 60$: BIT #READY,@S.CSR(R4) ;CARD READER ONLINE AND READY? BEQ 20$ ;IF EQ YES 70$: MOVB #1,S.CTM(R4) ;SET TIMEOUT FOR ONE SECOND .IFT DECB S.STS(R4) ;TIME TO PRINT MESSAGE? BNE CRPWF ;IF NE NO MOVB #C$$RTO,S.STS(R4) ;SET TO OUTPUT NEXT MESSAGE IN ;C$$RTO SECONDS BNE 80$ ;IF NE, CR NOT READY MESSAGES ENABLED INCB S.STS(R4) ;CR NOT READY MESSAGES NOT WANTED, SO BR CRPWF ;REBUSY CONTROLLER 80$: CALLR $DVMSG ;OUTPUT MESSAGE .IFF BR CRPWF .ENDC ; ; NO BUFFER SPACE AVAILABLE ; 90$: MOV #IE.NOD&377,R0 ;SET NO BUFFER AVAILABLE STATUS BR 160$ ; ; ; NO EOF YET AND NO MORE CARDS IN HOPPER ; 100$: MOV #!IS.SUC,R0 ;NO CARDS LEFT/NO EOF TST U.CW3(R5) ;ATTACH FOR AST? BEQ 160$ ;IF EQ NO BIS #IE,@S.CSR(R4) ;SET INTERRUPT ENABLE BR 160$ ; ; ; JUST HAD EOF AND NO MORE CARDS IN HOPPER (FOR USE WITH ATTACH FOR ; UNSOLICITED AST FUNCTION) ; 110$: MOV #!,R0 ;NO CARDS LEFT/JUST HAD EOF BIS #IE,@S.CSR(R4) ;SET INTERRUPT ENABLE INCB EOFCT(R5) ;FAKE NOT END OF FILE BR 160$ ; ; ; ABORT REQUESTED ; 120$: MOV #IE.ABO&377,R0 ;SET TRANSFER ABORTED STATUS BR 160$ ; ; ; UNRECOVERABLE ERROR ; 130$: MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR BR 160$ ; ; ; DEVICE NOT READY ERROR ; 140$: MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY ERROR BR 160$ ; ; ; END OF FILE ; 150$: MOV #IE.EOF&377,R0 ;SET END OF FILE STATUS 160$: CLR R1 ;CLEAR SECOND I/O STATUS WORD JMP 320$ ; ;+ ; **-$CRINT-CR11 CARD READER CONTROLLER INTERRUPTS ;- $CRINT:: ;;;REF LABEL INTSV$ CR,PR6,C$$R11,,UCBSV ;;;GENERATE INTERRUPT SAVE CODE MOV R3,-(SP) ;;;SAVE R3 MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCB MOV S.CSR(R4),R3 ;;;GET ADDRESS OF CSR BIT #176000,(R3)+ ;;;EXCEPTION CONDITION? BNE 170$ ;;;IF NE YES JMP 350$ ;;; 170$: MOV -(R3),R4 ;;;SAVE CARD READER INTERRUPT STATUS CLR (R3) ;;;DISABLE CARD READER INTERRUPT MOV (SP)+,R3 ;;;RESTORE R3 CALL $FORK ;;;CREATE A SYSTEM PROCESS MOV R4,R0 ;COPY STATUS WORD MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB TSTB EOFCT(R5) ;END OF FILE? BNE 190$ ;IF NE NO TST U.CW3(R5) ;ATTACH FOR AST? BEQ 180$ ;IF EQ NO BIT #HOPERR,R0 ;HOPERR ERROR? BNE 110$ ;IF NE - EOF, AST AND HOPPER ERROR 180$: BR 150$ ;EOF AND EITHER AST AND/OR HOPPER ERROR OR NOT 190$: BIT #TRONL,R0 ;TRANSITION TO ONLINE? BNE 200$ ;IF NE YES BIT #CRDONE,R0 ;CARD DONE? BNE 240$ ;IF NE YES BIT #HOPERR,R0 ;HOPERR ERROR? BNE 100$ ;IF NE, NO EOF YET AND HOPPER ERROR BR 230$ ;CHECK FOR OTHER ERRORS 200$: BITB #US.BSY,U.STS(R5) ;READ IN PROGRESS? BNE 60$ ;IF NE YES 210$: MOV U.CW3(R5),R1 ;GET ADDRESS OF AST BLOCK BEQ 130$ ;IF EQ, THERE IS NONE, ERROR MOV A.PRM(R1),R0 ;GET TCB ADDRESS OF TASK TO RECEIVE AST CALLR $QASTT ;QUEUE AST TO TASK 220$: JMP CRERR ; 230$: ;REF LABEL .IF DF,T$$KMG BIT #MTNERR,R0 ;MOTION ERROR? BNE 220$ ;IF NE YES BIT #TIMERR,R0 ;TIMING ERROR? BEQ 240$ ;IF EQ NO JMP 40$ ; .IFF BIT #MTNERR,R0 ;MOTION ERROR BNE 220$ ;IF NE YES BIT #TIMERR,R0 ;TIMING ERROR BEQ 240$ ;IF EQ NO BIS #TIMERR,U.CW2(R5) ;SHOW TIMING ERROR BR 220$ ; .ENDC 240$: MOV #80.*2,R0 ;ASSUME BINARY READ MOVB U.CW2(R5),R1 ;BINARY READ? BMI 250$ ;IF MI YES MOVB CCOLC(R5),R0 ;USE COLUMN COUNT TSTB R1 ;PACKED HOLLERITH? BNE 250$ ;IF NE YES CMP #CR026,CCOL1(R5) ;026 TRANSLATION CONTROL CARD? BEQ 400$ ;IF EQ YES CMP #CR029,CCOL1(R5) ;029 TRANSLATION CONTROL CARD? BEQ 410$ ;IF EQ YES MOV #TB029,R1 ;ASSUME 029 TRANSLATION BITB #US.MDE,U.STS(R5) ;029 TRANSLATION? BNE 250$ ;IF NE YES MOV #TB026,R1 ;SET FOR 026 TRANSLATION 250$: MOV STRBF(R5),R2 ;GET STARTING ADDRESS OF DATA BUFFER MOV U.CNT(R5),-(SP) ;GET NUMBER OF BYTES TO TRANSFER 260$: MOVB (R2)+,R3 ;GET NEXT BYTE FROM DATA BUFFER BIT #300,U.CW2(R5) ;BINARY OR PACKED HOLLERITH READ? BNE 300$ ;IF NE YES MOV #104,R4 ;ASSUME RPG SPECIAL CMPB R3,#240 ;RPG SPECIAL? BEQ 290$ ;IF EQ YES INC R4 ;INCREMENT CHARACTER CODE CMPB R3,#140 ;RPG SPECIAL? BEQ 290$ ;IF EQ YES MOVB R3,R4 ;SIGN EXTEND PACKED CODE BPL 270$ ;IF PL, ZONE 12 IS NOT PUNCHED ADD #340,R4 ;ADJUST FOR ZONE 12 PUNCH MOV R4,R3 ;COPY FOR ZONE COUNT DOWN 270$: SUB #40,R3 ;DECREMENT COUNT OF ZONE PUNCHES BMI 280$ ;IF MI DONE SUB #17,R4 ;SUBTRACT 21 AND STRIP ZONE PUNCH BR 270$ ; 280$: CMP R4,#105 ;INDEX WITHIN RANGE? BLOS 290$ ;IF LOS YES CLR R4 ;FORCE A BLANK 290$: ADD R1,R4 ;CALCULATE ADDRESS OF TRANSLATE CODE MOVB (R4),R3 ;GET TRANSLATED ASCII CODE 300$: MOV R3,-(SP) ;SET BYTE TO PUT IN USER BUFFER CALL $PTBYT ;PUT BYTE IN USER BUFFER DEC (SP) ;ANY MORE SPACE IN USER BUFFER? BLE 310$ ;IF LE NO DEC R0 ;ANY MORE BYTES TO PROCESS? BGT 260$ ;IF GT YES 310$: MOV U.CNT(R5),R1 ;GET SIZE OF USER BUFFER SUB (SP)+,R1 ;CALCULATE NUMBER OF BYTES TRANSFERED MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION STATUS 320$: CALL $IODON ;FINISH I/O OPERATION MOV STRBF(R5),R0 ;GET ADDRESS OF BUFFER TO RELEASE BEQ 340$ ;IF EQ, NO BUFFER MOV #80.,R1 ;ASSUME ASCII OR PACKED HOLLERITH READ TSTB U.CW2(R5) ;ASCII OR PACKED HOLLERITH? BPL 330$ ;IF PL YES ASL R1 ;SET FOR BINARY READ BUFFER 330$: CALL $DEACB ;DEALLOCATE DATA BUFFER 340$: JMP CRINI ;GO AGAIN ; ; STORE DATA IN CARD BUFFER ; 350$: MOV (R3)+,R4 ;;;READ BINARY CARD COLUMN MOV (R3),R3 ;;;READ PACKED HOLLERITH DATA MOVB CCOLC(R5),-(SP) ;;;GET CURRENT COLUMN NUMBER BNE 360$ ;;;IF NE, NOT COLUMN ONE MOV R4,CCOL1(R5) ;;;SAVE CARD COLUMN ONE DATA 360$: CMPB (SP)+,EOFCL(R5) ;;;PAST EOF COLUMNS? BHIS 370$ ;;;IF HIS YES CMP R4,#CREOF ;;;END OF FILE PUNCH? BNE 370$ ;;;IF NE NO DECB EOFCT(R5) ;;;DECREMENT EOF COUNTER 370$: CMPB CCOLC(R5),#80. ;;;80. COLUMNS READ (BUFFER FULL)? BEQ 390$ ;;;IF EQ YES -- DO NOT EXCEED BUFFER INCB CCOLC(R5) ;;;INCREMENT COLUMN NUMBER MOVB R3,@CURBF(R5) ;;;ASSUME ASCII OR PACKED HOLLERITH TSTB U.CW2(R5) ;;;ASCII OR PACKED HOLLERITH? BPL 380$ ;;;IF PL YES MOV R4,@CURBF(R5) ;;;STORE BINARY DATA INC CURBF(R5) ;;;UPDATE CURRENT BUFFER ADDRESS 380$: INC CURBF(R5) ;;;UPDATE CURRENT BUFFER ADDRESS 390$: MOV (SP)+,R3 ;;;RESTORE R3 RETURN ;;;EXIT INTERRUPT ; ; SET 026 TRANSLATION MODE ; 400$: BICB #US.MDE,U.STS(R5) ;CLEAR 029 TRANSLATION FLAG BR 420$ ; ; ; SET 029 TRANSLATION MODE ; 410$: BISB #US.MDE,U.STS(R5) ;SET 029 TRANSLATION FLAG 420$: JMP 20$ ;READ ANOTHER CARD ; ; **-CRATT-CARD READER CHECK FOR ATTACH FUNCTION ; ; OUTPUT: ; ; C=0 FUNCTION WAS NOT AN ATTACH OR DETACH ; C=1 FUNCTION WAS AN ATTACH OR DETACH ; CRATT: CMPB #,I.FCN+1(R1) ;ATTACH FUNCTION? BNE 480$ ;IF NE NO BITB #TF.AST,I.FCN(R1) ;ATTACH FOR UNSOLICITED AST? BEQ 495$ ;IF EQ NO 430$: TST I.PRM(R1) ;CHECK FOR NON-SPECIFIED AST ADDRESS BEQ 470$ ;IF EQ YES, ERROR MOV R1,-(SP) ;SAVE I/O PACKET ADDRESS MOV #ASTSIZ.,R1 ;SET LENGTH OF AST BLOCK IN BYTES CALL $ALOCB ;ALLOCATE CORE BLOCK FROM POOL BCC 440$ ;IF CC OK TST (SP)+ ;CLEAN STACK MOV #IE.NOD&377,R0 ;SET BUFFER ALLOCATION FAILURE BR 500$ ; 440$: MOV R0,U.CW3(R5) ;COPY ADDRESS OF AST BLOCK MOVB #1,EOFCT(R5) ;FAKE NOT END OF FILE MOV (SP)+,R1 ;RESTORE I/O PACKET ADDRESS MOV KISAR5,(R0)+ ;MAPPING (A.KSR5) MOV #CRCUB,(R0)+ ;WHERE TO CALL US BACK (A.DQSR) MOV R0,U.CW3(R5) ;COPY ADDRESS OF AST BLOCK TST (R0)+ ;SKIP PAST LINK WORD (A.LNK) CLR (R0)+ ;LENGTH OF CONTROL BLOCK (A.CBL) MOV #STKSIZ.,(R0)+ ;ALLOCATE 14 BYTES ON STACK (A.BYT) MOV I.PRM(R1),(R0)+ ;AST ADDRESS (A.AST) CLR (R0)+ ;NUMBER OF AST PARAMETERS (A.NPR) MOV I.TCB(R1),(R0) ;TCB ADDRESS OF TASK (A.PRM) BIT #READY,@S.CSR(R4) ;READER READY AND ONLINE? BNE 450$ ;IF NE NO CALL 210$ ;QUEUE AST NOW BR 495$ ;SKIP SETTING INTERRUPT ENABLE 450$: BIS #IE,@S.CSR(R4) ;SET INTERRUPT ENABLE BR 495$ ; 470$: MOV #IE.SPC&377,R0 ;SET ILLEGAL AST ADDRESS ERROR CODE BR 500$ ; 480$: CMPB #,I.FCN+1(R1) ;DETACH FUNCTION? BEQ 490$ ;IF EQ YES CLC ;SHOW FUNCTION WAS NOT ATTACH OR DETACH RETURN ; 490$: MOV U.CW3(R5),R0 ;GET ADDRESS OF AST BLOCK? BEQ 495$ ;IF EQ NONE CMP -(R0),-(R0) ;POINT TO BEGINNING OF ALLOCATED CORE BLOCK MOV #ASTSIZ.,R1 ;SET LENGTH OF AST BLOCK CALL $DEACB ;DEALLOCATE CORE BLOCK BIC #IE,@S.CSR(R4) ;CLEAR INTERRUPT ENABLE CLR U.CW3(R5) ;SHOW NO ATTACH FOR AST ANYMORE 495$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION CODE 500$: SEC ;SHOW FUNCTION WAS AN ATTACH OR DETACH RETURN ; .DSABL LSB ; ; CANCEL I/O OPERATION-FORCE I/O TO COMPLETE IS DEVICE IS NOT READY ; CRCAN: CMP R1,I.TCB(R0) ;;;REQUEST FOR CURRENT TASK? BNE 10$ ;;;IF NE NO BISB #US.ABO,U.STS(R5) ;;;SET FOR ABORT IF DEVICE NOT READY 10$: RETURN ;;; .END